
/**
 * Project Name:BaseFramework
 * File Name:PathTools.java
 * Package Name:com.sg.fileupload.common
 * Date:2017年12月27日下午4:40:29
 */

package com.sg.fileService.common;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import org.joda.time.DateTime;

import com.sg.fileService.entity.FileTypeConfig;
import com.sg.fileService.config.Property;
import com.sg.util.SnowflakeIdWorker;

import lombok.extern.slf4j.Slf4j;

/**
 * ClassName:FileUploadTools <br/>
 * Function: 文件上传模组工具 <br/>
 * Reason:   编辑通用处理方法 <br/>
 * Date:     2017年12月27日 下午4:40:29 <br/>
 * @author Lwt
 * @version
 * @since JDK 1.8
 * @see
 */
@Slf4j
public class FileUploadTools {

    /**
     *
     * getFilePath: 根据文件名称获得匹配类型的配置 <br/>
     * @author Lwt
     * @param fileName
     *               文件名称
     * @return
     * @since JDK 1.8
     * @update xzk，修改成私有方法，2018-1-23
     */
    private static FileTypeConfig getTypeConfig(String fileName) {
        for (String typeName : Property.FILE_TYPE_LIST) {
            try {
                if (Pattern.matches(Property.TYPE_CONFIG.get(typeName).getTypeExpression(), fileName)) {
                    return Property.TYPE_CONFIG.get(typeName);
                }
            } catch (PatternSyntaxException e) {
                log.error("--{}：文件{}匹配配置出错--->{}--", ErrorCode.MATCH_ERROR, fileName, e.getMessage());
            }
        }
        return null;
    }

    /**
     *
     * getFileTypeConfigDefault: 获取默认配置 <br/>
     * @author xzk
     * @return
     * @since JDK 1.8
     */
    public static FileTypeConfig getFileTypeConfigDefault() {
        FileTypeConfig fileConfig = new FileTypeConfig();

        fileConfig.setRenameEnabled(Property.GLOBAL_RENAME_ENABLED);
        fileConfig.setRenameExpression(Property.GLOBAL_RENAME_EXPRESSION);
        fileConfig.setTypeExpression(".*");
        fileConfig.setTypeName("default");
        fileConfig.setTypePath(Property.DEFAULT_PATH);

        return fileConfig;
    }

    /**
     *
     * getTypeConfig0: 根据文件名称获得匹配类型的配置的门面方法 <br/>
     * @author xzk
     * @param fileName
     *               文件名称
     * @return
     * @since JDK 1.8
     */
    public static FileTypeConfig getTypeConfig0(String fileName) {
        FileTypeConfig fileConfig = getTypeConfig(fileName);

        /**
         * 如果没有当前类型的配置,则设置为默认配置
         */
        if (fileConfig == null) {
            fileConfig = getFileTypeConfigDefault();
        }
        return fileConfig;
    }

    /**
     *
     * doRename: 文件根据配置重命名方法 <br/>
     * 重命名公式变量符:<br/>
     * %t: 毫秒时间戳<br/>
     * %T: 格式化时间戳:20180101120000000(2018年1月1日12时0分0秒0毫秒)<br/>
     * %T(yyyyMMddHHmmss): 自定义格式化时间戳,内容为常规SimpleDateFormat格式<br />
     * %f: 原始文件名<br />
     * @author Lwt
     * @param fileName
     *              文件名称
     * @return
     * @since JDK 1.8
     */
    public static String doRename(String fileName) {

        String suffix = fileName.indexOf('.') == -1 ? "" : fileName.substring(fileName.lastIndexOf('.'), fileName.length());

        return SnowflakeIdWorker.getId() + suffix;
    }

    /**
     *
     * doRename: 根据雪花算法重新生成文件名称 <br/>
     * 重命名公式变量符:<br/>
     * %t: 毫秒时间戳<br/>
     * %T: 格式化时间戳:20180101120000000(2018年1月1日12时0分0秒0毫秒)<br/>
     * %T(yyyyMMddHHmmss): 自定义格式化时间戳,内容为常规SimpleDateFormat格式<br />
     * %f: 原始文件名<br />
     * @author xzk
     * @param config
     * @param fileName
     * @return
     * @since JDK 1.8
     */
    public static String doRename(FileTypeConfig config, String fileName) {
        String newName = config.getRenameExpression();
        DateTime dateTime = new DateTime();
        String dateString;
        String formatString;
        String extensionName = fileName.indexOf('.') == -1 ? "" : fileName.substring(fileName.lastIndexOf('.'), fileName.length());
        String fileNameWithoutExt = fileName.indexOf('.') == -1 ? fileName : fileName.substring(0, fileName.lastIndexOf('.'));
        /**
         * %T(yyyyMMddHHmmss): 自定义格式化时间戳,内容为常规SimpleDateFormat格式
         */
        Pattern pattern = Pattern.compile("\\%T\\(.*?\\)");
        Matcher matcher = pattern.matcher(newName);
        while (matcher.find()) {
            dateString = matcher.group();
            formatString = dateString.substring(dateString.indexOf('(') + 1, dateString.indexOf(')'));
            newName = newName.replace(dateString, dateTime.toString(formatString));
        }

        /**
         * 格式化时间戳:20180101120000000(2018年1月1日12时0分0秒0毫秒)
         */
        newName = newName.replaceAll("\\%T", dateTime.toString("yyyyMMddHHmmssSSS"));

        /**
         * %t: 毫秒时间戳
         */
        newName = newName.replaceAll("\\%t", String.valueOf(dateTime.toDate().getTime()));

        /**
         * %f: 原始文件名
         */
        newName = newName.replaceAll("\\%f", fileNameWithoutExt);
        return newName + extensionName;
    }

    public static void main(String[] args) {
        String fileName = "Assassin's Creed® Origins2017-10-29-19-22-48.PNG";
        String regx = "(?i).*?(\\.jpg|\\.png|\\.gif|\\.bmp|\\.pcx|\\.tiff|\\.jpeg|\\.tga|\\.exif|\\.svg|\\.psd|\\.pcd)$";
        log.info(String.valueOf(Pattern.matches("(?i).*?(\\.jpg|\\.png|\\.gif|\\.bmp|\\.pcx|\\.tiff|\\.jpeg|\\.tga|\\.exif|\\.svg|\\.psd|\\.pcd)$", "\\default\\201802\\image\\o\\12309213338537984.jpg")));
        log.info(String.valueOf(fileName.matches(regx)));
    }
}
  
	